"""
用于封装与具体实现和业务逻辑无关的方法，如页面对象实例化等操作
BasePage作为父类，被其业务类继承
"""
from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver


class BasePage:
    # 属性前加_,代表本类可见，不对外可见：子类不可见
    _base_url = ''
    
    def __init__(self, base_driver= None):
        # 实例化时，使用base_driver判断driver对象是否已经创建，若已创建，无需创建，直接使用
        # 解决跳转到其它页面后又跳回微信首页的问题
        if base_driver is None:
            # 浏览器复用：复用已登录状态的企业微信页面
            # 关闭所有浏览器，执行 chrome -remote-debugging-port=9222 打开企业微信，登录
            # driver = webdriver.Chrome()
            option = webdriver.ChromeOptions()
            option.debugger_address = '127.0.0.1:9222'
            self.driver = webdriver.Chrome(options=option)
            self.driver.get(self._base_url)
            # driver.maximize_window()
            self.driver.implicitly_wait(20)
        else:
            # 将self.driver 添加一个WebDriver对象注解， 解决IDE类型提示的问题
            self.driver: WebDriver = base_driver
    
    # 封装 find_element()方法
    def find(self, by, locator=None):
            # 如果只传入一个元祖参数,需解包元组处理（find_element（）只支持2个参数，不支持元组）
        if locator is None:
            # *为解包元组
            return self.driver.find_element(*by)
            # 适配多种传参情景
        else:
            return self.driver.find_element(by=by, value=locator)